#include "graph.h"
#include <bits/stdc++.h>

// #define MAX_N 201
// #define N_MOVE_MAX 1500000
// 
// static int N;
// static int M;
// static int X;
// static int R;
// static int n_roads[MAX_N];
// static int road[MAX_N][MAX_N];
// static int road_idx[MAX_N][MAX_N];
// 
// static int color[MAX_N];
// static int pos;
// static int last_road;
// 
// static int called_answer[MAX_N];
// static int call_move;
// 
// static int expected_answer[MAX_N];
// 
// static void Wrong(int message) {
    // printf("Wrong Answer [%d]\n", message);
    // exit(1);
// }
// 
// void Answer(int D, int A) {
    // if (!(1 <= D && D <= R)) {
        // Wrong(1);
    // }
    // if (called_answer[D] != -1) {
        // Wrong(2);
    // }
// 
    // called_answer[D] = A;
// }
// 
// void Move(int I, int V) {
    // if (I < 1 || n_roads[pos] < I) {
        // Wrong(5);
    // }
    // if (V < 1 || X < V) {
        // Wrong(6);
    // }
// 
    // ++call_move;
// 
    // if (call_move > N_MOVE_MAX) {
        // Wrong(7);
    // }
    // --I;
    // color[pos] = V;
    // last_road = road_idx[road[pos][I]][pos] + 1;
    // pos = road[pos][I];
// }
// 
// int NumberOfRoads() {
    // return n_roads[pos];
// }
// 
// int LastRoad() {
    // return last_road;
// }
// 
// int Color() {
    // return color[pos];
// }


namespace my{
	using namespace std;
	#define mems(a,x) memset(a,x,sizeof(a))
	const int maxn=210;
	int n,x,r;
	int to[maxn][maxn];
	int fa[maxn],d[maxn];
	int vis[maxn][maxn];
	void dfs(int u,int lst){
		d[u]=NumberOfRoads();
		fa[u]=LastRoad();
		if(fa[u]!=-1)to[u][fa[u]]=lst,vis[u][fa[u]]=1;
		for(int i=1;i<=d[u];i++){
			Move(i,2);
			if(Color()==2)Move(LastRoad(),2);
			else if(Color()==3){
				vis[u][i]=2;
				Move(LastRoad(),3);
			}
			else{
				vis[u][i]=1;
				int fr=LastRoad();
				to[u][i]=++n;to[n][fr]=u;
				dfs(n,u);
				Move(fr,3);
			}
		}
	}
	int get(int id,int d){
		while(d--)id/=3;
		return id%3+1;
	}
	int calc(int v,int d){
		v--;while(d--)v*=3;
		return v;
	}
	void dfs2(int u,int pw){
		for(int i=1;i<=d[u];i++)if(!vis[u][i]){
			Move(i,Color());
			// cout<<u<<" "<<i<<" "<<Color()<<" "<<pw<<"\n";
			int fr=LastRoad();
			to[u][i]+=calc(Color(),pw);
			Move(fr,Color());
		}
		for(int i=1;i<=d[u];i++)if(vis[u][i]==1){
			if(i==fa[u])continue;
			Move(i,get(u,pw));
			dfs2(to[u][i],pw);
			Move(fa[to[u][i]],get(to[u][i],pw));
		}
	}
	int e[maxn][maxn],ans[maxn];
	void work(int R){
		x=3;r=R;n=1;
		dfs(1,0);
		for(int i=0;i<5;i++){
			dfs2(1,i);
		}
		mems(e,0x3f);
		for(int i=1;i<=n;i++)e[i][i]=0;
		for(int u=1;u<=n;u++){
			for(int i=1;i<=d[u];i++){
				int v=to[u][i];
				// cout<<u<<" "<<v<<" "<<i<<"\n";
				e[u][v]=e[v][u]=1;
			}
		}
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++)e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++)if(e[i][j]<=r)ans[e[i][j]]++;
		}
		for(int i=1;i<=r;i++)Answer(i,ans[i]);
	}
	#undef mems
}

void Inspect(int R) {
    return my::work(R);
}


// int main(void) {
    // int i, j;
    // if (scanf("%d%d%d", &N, &X, &R) != 3) {
        // fprintf(stderr, "error: cannot read N, X and R.\n");
        // exit(1);
    // }
// 
    // if (N < 2 || MAX_N < N) {
        // fprintf(stderr, "error: N is out of bounds.\n");
        // exit(1);
    // }
    // int M=0;
    // for (i = 0; i < N; ++i) {
        // scanf("%d", &(n_roads[i]));
		// M+=n_roads[i];
        // for (j = 0; j < N; ++j)
            // road_idx[i][j] = -1;
        // for (j = 0; j < n_roads[i]; ++j) {
            // scanf("%d", &(road[i][j]));
            // --road[i][j];
            // road_idx[i][road[i][j]] = j;
        // }
    // }
    // M>>=1;
// 
    // for (i = 1; i <= R; ++i) {
        // scanf("%d", &(expected_answer[i]));
    // }
// 
    // for (i = 0; i < N; ++i) {
        // color[i] = 1;
    // }
// 
    // pos = 0;
    // last_road = -1;
    // call_move = 0;
    // for (i = 1; i <= R; ++i)
        // called_answer[i] = -1;
// 
    // Inspect(R);
// 
    // for (i = 1; i <= R; ++i) {
        // if (called_answer[i] == -1) {
            // Wrong(3);
        // }
        // if (called_answer[i] != expected_answer[i]) {
            // Wrong(4);
        // }
    // }
// 
    // printf("Accepted: #move = %d\n", call_move);
    // printf("L = %d\n", call_move/M);
// 
    // return 0;
// }
// 